package com.qiyang.interceptor;

import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 拦截器定义演示
 * 实现 HandlerInterceptor
 * spring-mvc.xml进行配置
 */
public class MyInterceptor implements HandlerInterceptor {

    /**
     * 在处理方法之前执行，可在请求处理之前更改request中的属性值
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("执行拦截器 preHandle 方法");

        if(handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;

            // 获取处理方法的信息
            handlerMethod.getBean().getClass().getName();
            handlerMethod.getMethod().getName();
            handlerMethod.getMethod().getParameters();
        }
        // return true 标识可继续执行，false将中断后续执行
        return true;
    }

    /**
     * 处理方法若执行异常，则不会执行
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

        System.out.println("执行拦截器 postHandle 方法，视图渲染之前");

    }

    /**
     * 处理方法出现异常，该过滤器方法依然会执行
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception 可以获得执行的异常信息，或关闭相关资源
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("执行 afterCompletion 方法，视图渲染之后");
    }
}
